options ls=80 nocenter;
filename indat 'asciiqob.txt';
libname save 'sasdata';

*goptions device=xcolor;


filename grafout pipe 'lpr -Pbrar';
goptions device=pslmono gsfname=grafout gsfmode=replace gaccess=sasgastd
         vsize=7 vorigin=3 ftext=centx;

/* read stripped ak-91 extract and process means for figures */

data zero;
 infile indat;
 input lwklywge educ yob qob pob;

proc means;
title '1980 qob extract';

data one;
 set zero;

%MACRO QTRSYR;
             QTR220 QTR320 QTR420        QTR221 QTR321 QTR421
             QTR222 QTR322 QTR422
             QTR223 QTR323 QTR423        QTR224 QTR324 QTR424
             QTR225 QTR325 QTR425
             QTR226 QTR326 QTR426        QTR227 QTR327 QTR427
             QTR228 QTR328 QTR428        QTR229 QTR329 QTR429
%mend;

LENGTH QTR120 3
       %QTRSYR 3
       YR20-YR29 3
       QTR1-QTR4 3;

ARRAY AQTR QTRSYR;
  DO OVER AQTR; AQTR = 0 ; END;

YR20 = ((YOB=30) OR (YOB=40));
YR21 = ((YOB=31) OR (YOB=41));
YR22 = ((YOB=32) OR (YOB=42));
YR23 = ((YOB=33) OR (YOB=43));
YR24 = ((YOB=34) OR (YOB=44));
YR25 = ((YOB=35) OR (YOB=45));
YR26 = ((YOB=36) OR (YOB=46));
YR27 = ((YOB=37) OR (YOB=47));
YR28 = ((YOB=38) OR (YOB=48));
YR29 = ((YOB=39) OR (YOB=49));

QTR1 = (QOB=1);
QTR2 = (QOB=2);
QTR3 = (QOB=3);
QTR4 = (QOB=4);

QTR120 = QTR1 * YR20; QTR220 = QTR2 * YR20; QTR320 = QTR3 * YR20;
QTR420 = QTR4 * YR20;
QTR121 = QTR1 * YR21; QTR221 = QTR2 * YR21; QTR321 = QTR3 * YR21;
QTR421 = QTR4 * YR21;
QTR122 = QTR1 * YR22; QTR222 = QTR2 * YR22; QTR322 = QTR3 * YR22;
QTR422 = QTR4 * YR22;
QTR123 = QTR1 * YR23; QTR223 = QTR2 * YR23; QTR323 = QTR3 * YR23;
QTR423 = QTR4 * YR23;
QTR124 = QTR1 * YR24; QTR224 = QTR2 * YR24; QTR324 = QTR3 * YR24;
QTR424 = QTR4 * YR24;
QTR125 = QTR1 * YR25; QTR225 = QTR2 * YR25; QTR325 = QTR3 * YR25;
QTR425 = QTR4 * YR25;
QTR126 = QTR1 * YR26; QTR226 = QTR2 * YR26; QTR326 = QTR3 * YR26;
QTR426 = QTR4 * YR26;
QTR127 = QTR1 * YR27; QTR227 = QTR2 * YR27; QTR327 = QTR3 * YR27;
QTR427 = QTR4 * YR27;
QTR128 = QTR1 * YR28; QTR228 = QTR2 * YR28; QTR328 = QTR3 * YR28;
QTR428 = QTR4 * YR28;
QTR129 = QTR1 * YR29; QTR229 = QTR2 * YR29; QTR329 = QTR3 * YR29;
QTR429 = QTR4 * YR29;

keep yr21-yr29 %qtrsyr educ lwklywge qtr1-qtr3;

*******************************************************;

proc means;
title 'working data set';


proc syslin data=one;
title 'OLS';

model lwklywge = yr21-yr29 educ;

/* part I: 30 instrument case */

     proc syslin data=one 2sls;
     title '30-instrument case: regular 2sls';
     instruments yr21-yr29 %qtrsyr;
     endogenous lwklywge educ;
     model lwklywge = yr21-yr29 educ/overid;

***> reverse IV;

     proc syslin data=one 2sls;
     title '30-instrument case: reverse IV';
     instruments yr21-yr29 %qtrsyr;
     endogenous lwklywge educ;
     model educ = yr21-yr29 lwklywge/overid;

***> LIML;

     proc syslin data=one liml;
     title 'LIML';
     instruments yr21-yr29 %qtrsyr;
     endogenous lwklywge educ;
     model lwklywge = yr21-yr29 educ/overid;

***> reverse LIML;

     proc syslin data=one liml;
     title 'reverse LIML';
     instruments yr21-yr29 %qtrsyr;
     endogenous lwklywge educ;
     model educ = yr21-yr29 lwklywge/overid;

/* part II: 3 instrument case */

     proc syslin data=one 2sls;
     title '3 -instrument case: regular 2sls';
     instruments yr21-yr29 qtr1-qtr3;
     endogenous lwklywge educ;
     model lwklywge = yr21-yr29 educ/overid;

***> reverse IV;

     proc syslin data=one 2sls;
     title '3 -instrument case: reverse IV';
     instruments yr21-yr29 qtr1-qtr3;
     endogenous lwklywge educ;
     model educ = yr21-yr29 lwklywge/overid;

***> LIML;

     proc syslin data=one liml;
     title 'LIML';
     instruments yr21-yr29 qtr1-qtr3;
     endogenous lwklywge educ;
     model lwklywge = yr21-yr29 educ/overid;

***> reverse LIML;

     proc syslin data=one liml;
     title 'reverse LIML';
     instruments yr21-yr29 qtr1-qtr3;
     endogenous lwklywge educ;
     model educ = yr21-yr29 lwklywge/overid;

/* part III: 1 instrument case */

     proc syslin data=one 2sls;
     title '1 -instrument case: regular 2sls';
     instruments yr21-yr29 qtr1;
     endogenous lwklywge educ;
     model lwklywge = yr21-yr29 educ/overid;

***> reverse IV;

     proc syslin data=one 2sls;
     title '1 -instrument case: reverse IV';
     instruments yr21-yr29 qtr1;
     endogenous lwklywge educ;
     model educ = yr21-yr29 lwklywge/overid;

***> LIML;

     proc syslin data=one liml;
     title 'LIML';
     instruments yr21-yr29 qtr1;
     endogenous lwklywge educ;
     model lwklywge = yr21-yr29 educ/overid;

***> reverse LIML;

     proc syslin data=one liml;
     title 'reverse LIML';
     instruments yr21-yr29 qtr1;
     endogenous lwklywge educ;
     model educ = yr21-yr29 lwklywge/overid;

*** JIVE ***;

     proc reg data=one ;
     title2 'prepare JIVE: compute regular fits and leverage';
     first: model educ = yr21-yr29 %qtrsyr;
            output out=three h=lever p=edhat;

     data three; set three
                (keep=lwklywge educ yr21-yr29 edhat lever);
     keep lwklywge educ yr21-yr29 edhat1i edhat2i lever;
     edhat1i =  (edhat - (lever*educ));    ** JIVE fits constant denom version;
     edhat2i =  edhat1i/(1-lever);         ** JIVE fits original version;

***> jive sequence;

     proc syslin data=three 2sls;
     title 
     'second stage -- using constant-denom JIVE fitted values as instruments';
     instruments yr21-yr29 edhat1i;
     endogenous lwklywge educ;
     model lwklywge = yr21-yr29 educ;

     proc syslin data=three 2sls;
     title 'second stage -- TRUE JIVE fitted values as instruments';
     instruments yr21-yr29 edhat2i;
     endogenous lwklywge educ;
     model lwklywge = yr21-yr29 educ;

*** reverse JIVE ***;

data one;
  set one;
  
 educ2=lwklywge;
 lwklywge=educ;
 educ=educ2;

     proc reg data=one ;
     title2 'prepare REVERSE JIVE: compute regular fits and leverage';
     first: model educ = yr21-yr29 %qtrsyr;
            output out=three h=lever p=edhat;

     data three; set three
                (keep=lwklywge educ yr21-yr29 edhat lever);
     keep lwklywge educ yr21-yr29 edhat1i edhat2i lever;
     edhat1i =  (edhat - (lever*educ));    ** JIVE fits constant denom version;
     edhat2i =  edhat1i/(1-lever);         ** JIVE fits original version;

***> jive sequence;

     proc syslin data=three 2sls;
     title 
     'second stage -- using constant-denom JIVE fitted values as instruments';
     instruments yr21-yr29 edhat1i;
     endogenous lwklywge educ;
     model lwklywge = yr21-yr29 educ;

     proc syslin data=three 2sls;
     title 'second stage -- TRUE JIVE fitted values as instruments';
     instruments yr21-yr29 edhat2i;
     endogenous lwklywge educ;
     model lwklywge = yr21-yr29 educ;

run;
